package com.example.aviatorCount.model;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.util.Map;
import java.util.HashMap;

/**
 * 公式计算结果类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FormulaResult {
    
    /**
     * 是否成功
     */
    private boolean success;
    
    /**
     * 错误信息
     */
    private String errorMessage;
    
    /**
     * 计算结果数据
     */
    private Map<String, Object> data;
    
    /**
     * 计算耗时（毫秒）
     */
    private long executionTime;
    
    /**
     * 执行的步骤数量
     */
    private int stepCount;
    
    /**
     * 额外信息
     */
    private Map<String, Object> metadata;
    
    /**
     * 创建成功结果
     */
    public static FormulaResult success(Map<String, Object> data) {
        FormulaResult result = new FormulaResult();
        result.setSuccess(true);
        result.setData(data);
        result.setMetadata(new HashMap<>());
        return result;
    }
    
    /**
     * 创建成功结果（带执行信息）
     */
    public static FormulaResult success(Map<String, Object> data, long executionTime, int stepCount) {
        FormulaResult result = success(data);
        result.setExecutionTime(executionTime);
        result.setStepCount(stepCount);
        return result;
    }
    
    /**
     * 创建错误结果
     */
    public static FormulaResult error(String errorMessage) {
        FormulaResult result = new FormulaResult();
        result.setSuccess(false);
        result.setErrorMessage(errorMessage);
        result.setData(new HashMap<>());
        result.setMetadata(new HashMap<>());
        return result;
    }
    
    /**
     * 添加元数据
     */
    public FormulaResult addMetadata(String key, Object value) {
        if (this.metadata == null) {
            this.metadata = new HashMap<>();
        }
        this.metadata.put(key, value);
        return this;
    }
    
    /**
     * 获取单个结果值
     */
    public Object getValue(String key) {
        return data != null ? data.get(key) : null;
    }
    
    /**
     * 获取数字结果
     */
    public Double getNumberValue(String key) {
        Object value = getValue(key);
        if (value instanceof Number) {
            return ((Number) value).doubleValue();
        }
        return null;
    }
    
    /**
     * 获取字符串结果
     */
    public String getStringValue(String key) {
        Object value = getValue(key);
        return value != null ? value.toString() : null;
    }
    
    /**
     * 获取布尔结果
     */
    public Boolean getBooleanValue(String key) {
        Object value = getValue(key);
        if (value instanceof Boolean) {
            return (Boolean) value;
        }
        return null;
    }
}
